#ifndef __BSP_KEY_H__
#define __BSP_KEY_H__

#include "pinctrl.h"
#include "soc_osal.h"
#include "gpio.h"

#define KEY_MAX_NUM 2 // KEY数量

// KEY设备ID号定义
typedef enum
{
    KEY1 = 0,
    KEY2,
    // KEY_ALL, // all key
} key_id_t;

// key状态定义
typedef enum
{
    KEY_PRESS = GPIO_LEVEL_LOW,    // 按键按下
    KEY_RELEASE = GPIO_LEVEL_HIGH, // 按键释放
} key_state_t;

// 按键控制接口
/**
 * @brief  初始化按键设备。
 * @param  [in] key_id 需要初始化的led设备id号， 参考 @ref key_id_t 。
 * @param  [in] pin led设备使用的GPIO引脚， 参考 @ref pin_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_key_init(key_id_t key_id, pin_t pin);

/**
 * @brief  检测按键状态。
 * @param  [in] key_id 需要检测的按键设备id号， 参考 @ref key_id_t 。
 * @retval 按键状态 成功，参考 @ref key_state_t 。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_key_get_state(key_id_t key_id);

/**
 * @brief  开启按键中断。
 * @param  [in] key_id 需要开启中断的按键设备id号， 参考 @ref key_id_t 。
 * @param  [in] press_callback 按键设备按下时，中断回调函数。
 * @param  [in] release_callback 按键设备释放时，中断回调函数。 
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_key_enable_interrupt(key_id_t key_id, void (*press_callback)(void), void (*release_callback)(void));

/**
 * @brief  关闭按键中断。
 * @param  [in] key_id 需要开启中断的按键设备id号， 参考 @ref key_id_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_key_disable_interrupt(key_id_t key_id);

#endif // !__BSP_KEY_H__
